package classfile

// 字段、方法、接口方法项的公共父结构，前三者都视为类或接口的一个成员
type ConstantMemberRefInfo struct {
	// 指向此成员所属的类或接口的常量池的指针
	cp               ConstantPool
	// 此成员所属的类或接口在常量池中的索引，常量池此位置上必须是一个Constant_Class_Info结构。
	// 对于方法而言，它指向的Class_INFO必须是一个类。对于接口方法而言，它指向的必须是一个接口
	classIndex       uint16
	// 此成员的名称和类型在常量池中的索引。常量池此位置必须是一个nameAndType结构，表示一个成员的名称和类型
	nameAndTypeIndex uint16
}


// 常量池中用来表示字段引用的项
type ConstantFieldrefInfo struct {
	ConstantMemberRefInfo
}

// 常量池中用来表示方法引用的项
type ConstantMethodrefInfo struct {
	ConstantMemberRefInfo
}

// 常量池中用来表示接口方法引用的项
type ConstantInterfaceMethodrefInfo struct {
	ConstantMemberRefInfo
}

func (self *ConstantMemberRefInfo) readInfo(reader *ClassReader) {
	// 都是两个字节
	self.classIndex = reader.ReadUint16()
	self.nameAndTypeIndex = reader.ReadUint16()
}

func (self *ConstantMemberRefInfo) ClassName() string {
	// 获取此结构体所属的类的名称
	return self.cp.getClassName(self.classIndex)
}

// 返回此成员的名称和描述。对于field，它必须是字段描述符，对于method和interface_method，它必须是方法描述符
func (self *ConstantMemberRefInfo) NameAndDescriptor() (string, string) {
	return self.cp.getNameAndType(self.nameAndTypeIndex)
}

